<template>
  <div class="jobIndex">
    <basic-container>
      <avue-crud
        ref="crud"
        :page="page"
        v-model="form"
        :data="tableData"
        :table-loading="tableLoading"
        :option="tableOption"
        @on-load="getList"
        @row-save="save"
        @row-update="update"
        @refresh-change="refreshChange"
        @size-change="sizeChange"
        @search-reset="searchReset"
        @current-change="currentChange"
        @search-change="handleFilter"
      >
        <template slot-scope="scope" slot="jobStatus">
          <div v-if="scope.row.jobStatus === '1'">
            <el-tag type="info">{{ getDicNameJobStatus(scope.row.jobStatus) }}</el-tag>
          </div>
          <div v-else-if="scope.row.jobStatus === '2'">
            <el-tag type="success">{{ getDicNameJobStatus(scope.row.jobStatus) }}</el-tag>
          </div>
          <div v-else-if="scope.row.jobStatus === '3'">
            <el-tag type="danger">{{ getDicNameJobStatus(scope.row.jobStatus) }}</el-tag>
          </div>
        </template>
        <template slot-scope="scope" slot="jobExecuteStatus">
          <div v-if="scope.row.jobExecuteStatus === '0'">
            <el-tag type="success">{{ getDicNameJobExecuteStatus(scope.row.jobExecuteStatus) }}</el-tag>
          </div>
          <div v-else>
            <el-tag type="danger">{{ getDicNameJobExecuteStatus(scope.row.jobExecuteStatus) }}</el-tag>
          </div>
        </template>
        <template slot="cronExpressionForm" slot-scope="scope">
          <div class="cron">
            <el-popover v-model="cronPopover">
              <cron i18n="cn" @change="changeCron" @close="cronPopover=false"/>
              <el-input
                slot="reference"
                v-model="form.cronExpression"
                placeholder="请输入定时策略"
                @click="cronPopover=true"/>
            </el-popover>
          </div>
        </template>
        <template slot="menuLeft">
          <el-button v-if="permissions.job_sys_job_add" type="primary" @click="handleAddUpdate(false)">
            <!--          <el-button v-if="permissions.job_sys_job_add" type="primary" @click="handleAdd">-->
            新建任务
          </el-button>
          <el-tooltip content="暂停全部运行状态的定时任务" placement="top">
            <el-button v-if="permissions.job_sys_job_shutdown_job" type="warning" @click="shutdownJobs">
              暂停全部任务
            </el-button>
          </el-tooltip>
          <el-tooltip content="启动全部暂停状态的定时任务" placement="top">
            <el-button v-if="permissions.job_sys_job_start_job" type="success" @click="startJobs">
              启动全部任务
            </el-button>
          </el-tooltip>
          <!--          <el-tooltip content="谨慎使用" placement="top">-->
          <!--            <el-button v-if="permissions.job_sys_job_refresh_job" type="danger" @click="refreshJobs">重置全部任务-->
          <!--            </el-button>-->
          <!--          </el-tooltip>-->
        </template>
        <template
          slot="menu"
          slot-scope="scope">
          <el-button
            type="text"
            icon="el-icon-info"
            @click="handleJobLog(scope.row)">日志
          </el-button>
          <el-button
            v-if="permissions.job_sys_job_start_job"
            type="text"
            icon="el-icon-caret-right"
            @click="handleStartJob(scope.row)">启动
          </el-button>

          <el-button
            v-if="permissions.job_sys_job_shutdown_job"
            type="text"
            icon="el-icon-error"
            @click="handleShutDownJob(scope.row)">暂停
          </el-button>
          <el-button
            v-if="permissions.job_sys_job_edit && scope.row.jobStatus != '2'"
            type="text"
            icon="el-icon-edit"
            @click="handleAddUpdate(true,scope.row)">修改
          </el-button>
          <!--          <el-button-->
          <!--            v-if="permissions.job_sys_job_edit"-->
          <!--            type="text"-->
          <!--            icon="el-icon-edit"-->
          <!--            @click="handleUpdate(scope.row,scope.index)">修改-->
          <!--          </el-button>-->
          <el-button
            v-if="permissions.job_sys_job_run_job"
            type="text"
            icon="el-icon-s-promotion"
            @click="handleRunJob(scope.row)">执行
          </el-button>
          <el-button
            v-if="permissions.job_sys_job_del"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row,scope.index)">删除
          </el-button>
        </template>
      </avue-crud>
    </basic-container>
    <jobLog v-if="dialogFormVisible" ref="logRef"></jobLog>

    <table-form v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getList(page)"></table-form>
  </div>

</template>

<script>
  import {
    addObj, delObj, fetchList, isValidTaskName, putObj, refreshJobsRa,
    runJobRa, shutDownJobRa, shutdownJobsRa, startJobRa, startJobsRa
  } from '@/api/daemon/sys-job'
  import {tableOption} from '@/const/crud/daemon/sys-job'
  import {remote} from '@/api/admin/dict'
  import {mapGetters} from 'vuex'
  import {cron} from 'vue-cron'
  import jobLog from './job-log'
  import TableForm from './job-form'

  export default {
    name: 'jobIndex',
    components: {cron, jobLog, TableForm},
    data() {
      return {
        form: {},
        addOrUpdateVisible: false,
        cronPopover: false,
        queryParams: {}, // 全局检索条件
        tableData: [],
        dialogFormVisible: false,
        jobId: '',
        page: {
          total: 0, // 总页数
          currentPage: 1, // 当前页数
          pageSize: 10 // 每页显示多少条,
        },
        tableLoading: false,
        tableOption: tableOption,
        JobExecuteStatusDicCache: [],
        JobStatusDicCache: [],


        editData: {
          jobName: '',
          jobGroup: '',
          jobType: '1',
          executePath: '',
          className: '',
          methodType: 'POST',
          methodName: '',
          methodParamsValue: '',
          cronExpression: '',
          misfirePolicy: '',
          remark: '',
        },
        allConfig: ['executePath', 'className', 'methodName', 'methodParamsValue', 'methodType'],
        typeConfig: {
          type1: ['executePath'],
          type2: ['executePath'],
          type3: ['className', 'methodName', 'methodParamsValue'],
          type4: ['className', 'methodName'],
          type9: []
        }
      }
    },
    computed: {
      ...mapGetters(['permissions'])
    },
    watch: {
      // 'form.jobType'(val){
      //   console.log('val',this.typeConfig['type'+val])
      //   if (!this.typeConfig['type'+val] || !val) return
      //   this.tableOption.column.forEach(item => {
      //     if (!this.allConfig.includes(item.prop)) return
      //     item.addDisplay = this.typeConfig['type'+val].includes(item.prop)
      //     // if (this.typeConfig['type'+val].includes(item.prop)){
      //     //   item.addDisplay = false
      //     // }else{
      //     //   item.addDisplay = true
      //     // }
      //   })
      //   // this.$refs.crud.rowUpdate()
      //   console.log('ssssssssss', this.tableOption.column)
      // }
    },
    mounted: function () {
      this.getDicJobExecuteStatusCache('job_execute_status')// 获取定时任务运行时状态
      this.getDicJobStatusCache('job_status')// 获取定时任务状态
    },
    methods: {
      changeCron(val) {
        this.form.cronExpression = val
      },
      /**
       * 定时任务分页查询
       */
      getList(page, params) {
        this.tableLoading = true
        fetchList(Object.assign({
          descs: 'create_time',
          current: page.currentPage,
          size: page.pageSize
        }, params, this.queryParams)).then(response => {
          this.tableData = response.data.data.records
          this.page.total = response.data.data.total
          this.tableLoading = false
        }).catch(error => {
          this.tableLoading = false
        })
      },

      /**
       * 定时任务检索查询分页查询
       */
      handleFilter(params, done) {
        this.queryParams = params
        this.page.currentPage = 1
        this.getList(this.page)
        done()
      },
      /**
       * 启动定时任务
       */
      handleStartJob(row) {
        const jobStatus = row.jobStatus
        if (jobStatus === '1' || jobStatus === '3') {
          this.$confirm(
            '即将发布或启动(任务名称:' + row.jobName + '), 是否继续?',
            '提示',
            {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              type: 'warning'
            }
          ).then(() => {
            startJobRa(row.jobId).then(response => {
              const code = response.data.code
              if (code === 0) {
                this.$notify({
                  title: '成功',
                  message: '启动成功',
                  type: 'success'
                })
                this.refreshChange()
                // this.getList(this.page)
              }
            }).catch(() => {
            })
          })
        } else {
          this.$notify.error({
            title: '错误',
            message: '定时任务已运行'
          })
        }
      },
      /**
       * 执行定时任务
       */
      handleRunJob(row) {
        if (row.jobStatus == 1) {
          this.$message.error('请先启动再执行！')
          return false
        }
        this.$confirm(
          '立刻执行一次任务(任务名称:' + row.jobName + '), 是否继续?',
          '提示',
          {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          runJobRa(row.jobId).then(response => {
            const code = response.data.code
            if (code === 0) {
              this.$notify({
                title: '成功',
                message: '执行成功',
                type: 'success'
              })
              this.refreshChange()
            }
          }).catch(() => {
          })
        })

      },
      handleAdd() {
        this.$refs.crud.rowAdd()
      },
      handleAddUpdate(isEdit, row) {
        // this.$refs.crud.rowAdd()
        this.addOrUpdateVisible = true
        this.$nextTick(() => {
          this.$refs.addOrUpdate.init(isEdit, row)
        })
      },
      handleUpdate(row, index) {
        const jobStatus = row.jobStatus
        if (jobStatus === '1' || jobStatus === '3') {
          this.$refs.crud.rowEdit(row, index)
        } else {
          this.$notify.error({
            title: '错误',
            message: '运行中定时任务不可修改，请先暂停后操作'
          })
        }
      },
      /**
       * 暂停定时任务
       */
      handleShutDownJob(row) {
        const jobStatus = row.jobStatus
        if (jobStatus === '2') {
          this.$confirm(
            '即将暂停(任务名称:' + row.jobName + '), 是否继续?',
            '提示',
            {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              type: 'warning'
            }
          ).then(() => {
            shutDownJobRa(row.jobId).then(response => {
              const code = response.data.code
              if (code === 0) {
                this.getList(this.page)
                this.$notify({
                  title: '成功',
                  message: '暂停成功',
                  type: 'success'
                })
              }
              this.refreshChange()
            }).catch(() => {})
          })
        } else {
          this.$notify.error({
            title: '错误',
            message: '已暂停，不要重复操作'
          })
        }
      },
      /**
       * 刷新回调
       */
      refreshChange() {
        this.getList(this.page)
      },
      searchReset() {
        this.searchForm = {}
        this.page.currentPage = 1
        this.getList(this.page)
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize
      },
      currentChange(current) {
        this.page.currentPage = current
      },
      shutdownJobs() {
        this.$confirm(
          '即将暂停全部运行中定时任务, 是否继续?',
          '提示',
          {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          shutdownJobsRa().then(response => {
            const code = response.data.code
            const msg = response.data.msg
            const data = response.data.data
            if (code === 0) {
              this.getList(this.page)
              this.$notify.success(data)
            } else {
              this.$notify.error(data)
            }
          }).catch(() => {
          })
        })
      },
      /**
       * 启动全部暂停定时任务
       */
      startJobs() {
        this.$confirm(
          '即将启动全部暂定中定时任务, 是否继续?',
          '提示',
          {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          startJobsRa().then(response => {
            const code = response.data.code
            if (code === 0) {
              this.getList(this.page)
              this.$notify.success('启动成功')
            } else {
              this.$notify.error('启动失败')
            }
          }).catch(() => {
          })
        })
      },
      /**
       * 刷新定时任务
       */
      refreshJobs() {
        this.$confirm(
          '即将刷新全部定时任务, 是否继续?',
          '提示',
          {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          refreshJobsRa().then(response => {
            const code = response.data.code
            if (code === 0) {
              this.getList(this.page)
              this.$notify.success('重置成功')
            } else {
              this.$notify.error('重置失败')
            }
          }).catch(() => {
          })
        })
      },
      /**
       * 新增定时任务持久化处理
       */
      save(row, done, loading) {
        isValidTaskName({
          'jobName': row.jobName,
          'jobGroup': row.jobGroup
        }).then(response => {
          const result = response.data.code
          if (result !== 0) {
            this.$notify.error('任务名称与任务组重复，请确认后重新添加')
          } else {
            addObj(row).then(() => {
              this.$notify.success('创建成功')
              this.getList(this.page)
            }).catch(() => {
              loading()
            })
          }
          done()
        })
      },
      /**
       * 更新定时任务持久化处理
       */
      update(row, index, done, loading) {
        putObj(row).then(() => {
          this.getList(this.page)
          done()
          this.$notify.success('修改成功')
        }).catch(() => {
          loading()
        })
      },
      /**
       * 删除定时任务持久化处理
       */
      handleDelete(row) {
        const jobStatus = row.jobStatus
        if (jobStatus === '1' || jobStatus === '3') {
          this.$confirm('是否确认删除(任务名称:' + row.jobName + '), 是否继续?删除后不可恢复', '警告', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(function () {
            return delObj(row.jobId)
          }).then(() => {
            this.getList(this.page)
            this.$notify.success('删除成功')
          }).catch(function () {
          })
        } else {
          this.$notify.error('运行中定时任务不可删除，请先暂停后操作')
        }
      },
      handleJobLog(row) {
        this.dialogFormVisible = true
        this.$nextTick(() => {
          this.$refs.logRef.getJobLog(row)
        })
      },
      /**
       * 获取字典显示名称并缓存
       */
      getDicJobExecuteStatusCache(type) {
        remote(type).then(response => {
          const code = response.data.code
          if (code === 0) {
            const _data = response.data.data
            this.JobExecuteStatusDicCache = _data
          }
        })
      },
      /**
       * 获取字典显示名称并缓存
       */
      getDicJobStatusCache(type) {
        remote(type).then(response => {
          const code = response.data.code
          if (code === 0) {
            const _data = response.data.data
            this.JobStatusDicCache = _data
          }
        })
      },
      /**
       * 获取字典定时任务执行状态字典值显示名称
       */
      getDicNameJobExecuteStatus(value) {
        let re = ''
        this.JobExecuteStatusDicCache.forEach(obj => {
          if (obj.value === value) {
            re = obj.label
            return
          }
        })
        return re
      },
      /**
       * 获取字典定时任务状态字典值显示名称
       */
      getDicNameJobStatus(value) {
        let re = ''
        this.JobStatusDicCache.forEach(obj => {
          if (obj.value === value) {
            re = obj.label
            return
          }
        })
        return re
      }
    }
  }
</script>

<style lang="scss" scoped>
</style>
